import openpyxl as op
from log.ulog import logger
from openpyxl.styles import Font, PatternFill, Alignment
from utils.tools import NOT_DICT_BIDDING_DATA, DICT_BIDDING_DATA, DEVELOP_BIDDING_DATA, NOT_DICT_WIN_BID_DATA, \
    DICT_WIN_BID_DATA, DEVELOP_WINNING_BID_DATA

sheet = {
    'DICT类设计咨询标数据': {
        'sheetStyle': {
            'A': {'title': '序号', 'width': 8},
            'B': {'title': '招标阶段', 'width': 15},
            'C': {'title': '关键字', 'width': 15},
            'D': {'title': '归属区域', 'width': 20},
            'E': {'title': '项目名称', 'width': 60},
            'F': {'title': '招标单位', 'width': 30},
            'G': {'title': '公告发布时间', 'width': 30},
            'H': {'title': '招标规模/万元', 'width': 30},
            'I': {'title': '链接', 'width': 100},
            'J': {'title': '政企/区县分公司是否跟进', 'width': 60},
        }
    },
    'DICT类设计咨询标中标数据': {
        'sheetStyle': {
            'A': {'title': '序号', 'width': 10},
            'B': {'title': '招标阶段', 'width': 15},
            'C': {'title': '关键字', 'width': 15},
            'D': {'title': '归属区域', 'width': 20},
            'E': {'title': '项目名称', 'width': 60},
            'F': {'title': '招标单位', 'width': 30},
            'G': {'title': '中标单位', 'width': 30},
            'H': {'title': '公告发布时间', 'width': 30},
            'I': {'title': '招标规模/万元', 'width': 30},
            'J': {'title': '链接', 'width': 100},
            'K': {'title': '政企/区县分公司是否跟进', 'width': 60},
        }
    },
    'DICT类招标数据': {
        'sheetStyle': {
            'A': {'title': '序号', 'width': 8},
            'B': {'title': '招标阶段', 'width': 15},
            'C': {'title': '关键字', 'width': 15},
            'D': {'title': '归属区域', 'width': 20},
            'E': {'title': '项目名称', 'width': 60},
            'F': {'title': '招标单位', 'width': 30},
            'G': {'title': '公告发布时间', 'width': 30},
            'H': {'title': '招标规模/万元', 'width': 30},
            'I': {'title': '链接', 'width': 100},
            'J': {'title': '政企/区县分公司是否跟进', 'width': 60},
        }
    },
    'DICT类中标数据': {
        'sheetStyle': {
            'A': {'title': '序号', 'width': 10},
            'B': {'title': '招标阶段', 'width': 15},
            'C': {'title': '关键字', 'width': 15},
            'D': {'title': '归属区域', 'width': 20},
            'E': {'title': '项目名称', 'width': 60},
            'F': {'title': '招标单位', 'width': 30},
            'G': {'title': '中标单位', 'width': 30},
            'H': {'title': '公告发布时间', 'width': 30},
            'I': {'title': '招标规模/万元', 'width': 30},
            'J': {'title': '链接', 'width': 100},
            'K': {'title': '政企/区县分公司是否跟进', 'width': 60},
        }
    },
    '非DICT类其余招标数据': {
        'sheetStyle': {
            'A': {'title': '序号', 'width': 10},
            'B': {'title': '招标阶段', 'width': 15},
            'C': {'title': '关键字', 'width': 15},
            'D': {'title': '归属区域', 'width': 20},
            'E': {'title': '项目名称', 'width': 60},
            'F': {'title': '招标单位', 'width': 30},
            'G': {'title': '发布时间', 'width': 30},
            'H': {'title': '招标规模/元', 'width': 30},
            'I': {'title': '链接', 'width': 100},
            'J': {'title': '政企/区县分公司是否跟进', 'width': 60},
        }
    },
    '非DICT类其余中标数据': {
        'sheetStyle': {
            'A': {'title': '序号', 'width': 10},
            'B': {'title': '招标阶段', 'width': 15},
            'C': {'title': '关键字', 'width': 15},
            'D': {'title': '归属区域', 'width': 20},
            'E': {'title': '项目名称', 'width': 60},
            'F': {'title': '招标单位', 'width': 30},
            'G': {'title': '中标单位', 'width': 30},
            'H': {'title': '发布时间', 'width': 30},
            'I': {'title': '招标规模/元', 'width': 30},
            'J': {'title': '链接', 'width': 100},
            'K': {'title': 'c', 'width': 60},
        }
    },
    '开发招标数据': {
        'sheetStyle': {
            'A': {'title': '序号', 'width': 8},
            'B': {'title': '招标阶段', 'width': 15},
            'C': {'title': '关键字', 'width': 15},
            'D': {'title': '归属区域', 'width': 20},
            'E': {'title': '项目名称', 'width': 60},
            'F': {'title': '招标单位', 'width': 30},
            'G': {'title': '发布时间', 'width': 30},
            'H': {'title': '招标规模/元', 'width': 30},
            'I': {'title': '链接', 'width': 100},
            'J': {'title': 'c', 'width': 60},
        }
    },
    '开发中标数据': {
        'sheetStyle': {
            'A': {'title': '序号', 'width': 10},
            'B': {'title': '招标阶段', 'width': 15},
            'C': {'title': '关键字', 'width': 15},
            'D': {'title': '归属区域', 'width': 20},
            'E': {'title': '项目名称', 'width': 60},
            'F': {'title': '招标单位', 'width': 30},
            'G': {'title': '中标单位', 'width': 30},
            'H': {'title': '发布时间', 'width': 30},
            'I': {'title': '招标规模/元', 'width': 30},
            'J': {'title': '链接', 'width': 100},
            'K': {'title': 'content', 'width': 60},
        }
    }
}

# sheet 处理类
class sheetprocess:
    """
    类的初始化方法。

    参数:
    filepath: 字符串，表示文件的路径。

    返回值:
    无
    """

    def __init__(self, filepath):
        self.filepath = filepath

    def createWorkBook(self):
        """
           创建并初始化一个工作簿（Workbook）。
           遍历sheet初始化信息，为每个sheet创建工作表，并设置表头及宽度。最后保存工作簿到指定路径。

           参数:
           self: 对象自身的引用。

           返回值:
           无
           """
        workbook = op.Workbook()  # 创建工作簿对象
        sheetinit = sheet  # sheetinit为sheet的副本，用于遍历和处理
        for key, value in sheetinit.items():  # 遍历sheet，key为sheet名，value为sheet的结构信息
            workbook.create_sheet(key)  # 创建工作表
            # 下面的循环用于设置工作表的列和列宽
            for index, sub1value in value.items():
                for row1index, row1value in sub1value.items():
                    workbook[key][row1index + '1'] = row1value['title']  # 设置表头
                    workbook[key].column_dimensions[row1index].width = row1value['width']  # 设置列宽
                    workbook[key].row_dimensions[1].height = 40  # 设置第一行的高度
        workbook.remove(workbook['Sheet'])  # 移除默认创建的Sheet
        workbook.save(self.filepath)  # 保存工作簿到指定路径

# 格式化统一格式
def uniformStyle(excel):
    '''

    :param excel:
    :return:

    蓝色:5193dd
    白色:ffffff
    浅灰色:acb7c4
    '''
    # 基数行填充颜色
    fillodd = PatternFill(fill_type='solid',
                          start_color='ffffff'
                          )
    # 偶数行填充颜色
    filleven = PatternFill(fill_type='solid',
                           start_color='acb7c4'
                           )
    # 第一行填充颜色
    fillTitle = PatternFill(fill_type='solid',
                            start_color='5193dd')
    # 对齐方式
    alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
    # 边框样式
    border = op.styles.Border(left=op.styles.Side(border_style='thin', color='000000'),
                              right=op.styles.Side(border_style='thin', color='000000'),
                              top=op.styles.Side(border_style='thin', color='000000'),
                              bottom=op.styles.Side(border_style='thin', color='000000'))
    highlight = Font(underline="single", color="0563C1", size=10)
    # 字体样式
    font = Font(size=10)
    # 第一行字体样式
    fontTitle = Font(size=12, bold=True, color='ffffff')
    try:
        workbook = op.load_workbook(excel)
    except Exception as e:
        logger.error('没有找到格式化的 excel 文件')
    for sheetname in workbook.sheetnames:
        if sheetname == '说明文档':
            continue
        # 处理表头元素
        for cell1 in workbook[sheetname][1]:
            cell1.font = fontTitle
            cell1.fill = fillTitle
            cell1.alignment = alignment
            cell1.border = border
        # 处理表格元素
        for index, row in enumerate(workbook[sheetname].iter_rows(max_row=workbook[sheetname].max_row,
                                                                  min_row=2,
                                                                  max_col=workbook[sheetname].max_column,
                                                                  min_col=1)):
            workbook[sheetname].row_dimensions[index + 2].height = 30
            if index % 2 == 0:
                fill = fillodd
            else:
                fill = filleven
            for cell in row:
                cell.fill = fill
                cell.font = font
                cell.border = border
                cell.alignment = alignment

                if isinstance(cell.value, str):
                    cell.value = cell.value.strip()
                if cell.value is None:
                    cell.value = ' - '
                # 处理高亮
                if sheetname == DEVELOP_BIDDING_DATA or sheetname == DICT_BIDDING_DATA or sheetname == NOT_DICT_BIDDING_DATA:
                    workbook[sheetname]['I' + str(index + 2)].font = highlight
                    workbook[sheetname]['I' + str(index + 2)].hyperlink = workbook[sheetname][
                        'I' + str(index + 2)].value
                elif sheetname == DEVELOP_WINNING_BID_DATA or sheetname == DICT_WIN_BID_DATA or sheetname == NOT_DICT_WIN_BID_DATA:
                    workbook[sheetname]['J' + str(index + 2)].font = highlight
                    workbook[sheetname]['J' + str(index + 2)].hyperlink = workbook[sheetname][
                        'J' + str(index + 2)].value
    workbook.save(excel)

# 添加测试数据
def dataAppendTestCase(excel):
    workbook = op.load_workbook(filename=excel, read_only=False, data_only=False, keep_vba=False)
    for sheetname in workbook.sheetnames:
        # print(sheetname)
        for i in range(1, 100):
            datas = ['1', '2', '3', '4', '5', '6', '7']
            dataAdd(workbook[sheetname], datas)
    workbook.save(excel)

# 添加数据
def dataAppend(data: list, worrbook, sheetname):
    """
    将数据追加到指定的Excel工作表中。

    参数:
    - data: 要追加到工作表的数据列表。
    - worrbook: Excel文件的路径，数据将追加到此文件的指定工作表中。
    - sheetname: 要操作的工作表的名称。

    返回值:
    - 无。
    """
    workbook = op.load_workbook(filename=worrbook, read_only=False, data_only=False, keep_vba=False)
    datacontainer = data
    try:
        if sheetname != '开发招标数据' and sheetname != '开发中标数据':
            # print(datacontainer)
            print('插入数据中.......')
    except Exception as e:
        print('发生错误:', e)
    finally:
        dataAdd(workbook[sheetname], datacontainer)
        workbook.save(worrbook)

# 添加数据
def dataAdd(excelsheet, data: list):
    """
    向Excel表格中添加数据。

    参数:
    - excelsheet: Excel表格对象，用于操作Excel文件。
    - data: list类型，包含要添加到表格的数据。

    返回值:
    无
    """
    maxrow = excelsheet.max_row
    data.insert(0, maxrow)
    # 添加备份数据
    with open('test', 'a', encoding="utf-8") as f:
        f.write(str(data) + '\n')
        f.close()
    try:
        excelsheet.append(data)
    except Exception as e:
        # print('添加数据失败:', e)
        pass
    finally:
        pass
# work = sheetprocess()
# work.createWorkBook()
# dataAppendTestCase(excel='../output/1-31招标数据.xlsx')
# uniformStyle(excel='../output/1-31招标数据.xlsx')
